#!/bin/bash

# rpm-build-compare.sh
#
# Written by Charles R. Anderson <cra@wpi.edu>
#   Slight mod by David Eisenstein <deisenst@gtw.net>   11/23/2004

pkgA=$1
  BaseA=`basename $pkgA`
pkgB=$2
  BaseB=`basename $pkgB`

# get provides
rm -f $BaseA-provides $BaseB-provides
rpm -qp --provides $pkgA | sort > $BaseA-provides
rpm -qp --provides $pkgB | sort > $BaseB-provides
# get requires
rm -f $BaseA-requires $BaseB-requires
rpm -qp --requires $pkgA | sort > $BaseA-requires
rpm -qp --requires $pkgB | sort > $BaseB-requires
# get filelists (cut timestamps and linkcounts out)
rm -f $BaseA-filelist $BaseB-filelist
rpm -qpvl $pkgA | cut -c1-11,17-46,60- | sort -t/ -k2 > $BaseA-filelist
rpm -qpvl $pkgB | cut -c1-11,17-46,60- | sort -t/ -k2 > $BaseB-filelist
# extract package to separate roots
rm -rf $BaseA-root $BaseB-root
mkdir $BaseA-root $BaseB-root
rpm2cpio $pkgA | (cd $BaseA-root; cpio -id) 2> /dev/null > /dev/null
rpm2cpio $pkgB | (cd $BaseB-root; cpio -id) 2> /dev/null > /dev/null
# get "file" output
rm -f $BaseA-file $BaseB-file
(cd $BaseA-root; find . -type f -exec file {} \; | sort -u) 2> /dev/null > $BaseA-file
(cd $BaseB-root; find . -type f -exec file {} \; | sort -u) 2> /dev/null > $BaseB-file
# get ldd output
rm -f $BaseA-ldd $BaseB-ldd
(cd $BaseA-root; cat ../$BaseA-file | grep ELF | cut -d: -f1 | xargs ldd | sort -u) 2> /dev/null > $BaseA-ldd
(cd $BaseB-root; cat ../$BaseB-file | grep ELF | cut -d: -f1 | xargs ldd | sort -u) 2> /dev/null > $BaseB-ldd
# get nm output (cut addresses out)
rm -f $BaseA-nm $BaseB-nm
(cd $BaseA-root; cat ../$BaseA-file | grep ELF | cut -d: -f1 | xargs nm | cut -c10- | sort -u) 2> /dev/null > $BaseA-nm
(cd $BaseB-root; cat ../$BaseB-file | grep ELF | cut -d: -f1 | xargs nm | cut -c10- | sort -u) 2> /dev/null > $BaseB-nm

# print report
(echo ===============================================================================
echo Differences between:
echo
echo $pkgA
echo $pkgB
echo
if ! diff -q $BaseA-provides $BaseB-provides 2> /dev/null > /dev/null; then
    echo -------------------------------------------------------------------------------
    echo RPM Provides:
    echo
    diff -ub $BaseA-provides $BaseB-provides
    echo
fi
if ! diff -q $BaseA-requires $BaseB-requires 2> /dev/null > /dev/null; then
    echo -------------------------------------------------------------------------------
    echo RPM Requires:
    echo
    diff -ub $BaseA-requires $BaseB-requires
    echo
fi
if ! diff -q $BaseA-file $BaseB-file 2> /dev/null > /dev/null; then
    echo -------------------------------------------------------------------------------
    echo 'File Types (file):'
    echo
    diff -ub $BaseA-file $BaseB-file
    echo
fi
if ! diff -q $BaseA-ldd $BaseB-ldd 2> /dev/null > /dev/null; then
    echo -------------------------------------------------------------------------------
    echo 'Dynamic Link Libraries (ldd):'
    echo
    diff -ub $BaseA-ldd $BaseB-ldd
    echo
fi
if ! diff -q $BaseA-nm $BaseB-nm 2> /dev/null > /dev/null; then
    echo -------------------------------------------------------------------------------
    echo 'Symbol Tables (nm):'
    echo
    diff -ub $BaseA-nm $BaseB-nm
    echo
fi
if ! diff -q $BaseA-filelist $BaseB-filelist 2> /dev/null > /dev/null; then
    echo -------------------------------------------------------------------------------
    echo RPM File Lists:
    echo
    diff -ub $BaseA-filelist $BaseB-filelist 2> /dev/null
    echo
fi
if ! diff -qr $BaseA-root $BaseB-root 2> /dev/null > /dev/null; then
    echo -------------------------------------------------------------------------------
    echo RPM Packaged Files:
    echo
    diff -urNb $BaseA-root $BaseB-root 2> /dev/null
    echo
fi
echo ===============================================================================
) > $BaseB-diff.txt

rm -rf $BaseA-root $BaseB-root
rm -f $BaseA-provides $BaseB-provides
rm -f $BaseA-requires $BaseB-requires
rm -f $BaseA-filelist $BaseB-filelist
rm -f $BaseA-file $BaseB-file
rm -f $BaseA-ldd $BaseB-ldd
rm -f $BaseA-nm $BaseB-nm
